#ifndef _SERVER_USER_H
#define _SERVER_USER_H

#include "stdio.h"
#include "stddef.h"
#include "wchar.h"

#include "server_typedef.h"
#include "server_tools.h"
#include "server_log.h"
#include "server_assert.h"
#include "server_global_config.h"
#include "server_library_object.h"

#define USER_DATA_FILE_PATH "./server/data/user_data.dat"


typedef struct _UserPermissions{
    uint8 manage_authority;
    uint8 ObjectLendAuthority;
} UserPermissions;

typedef struct _UserLentObject {
    uint32      object_id;          // Object ID
    wchar_t     object_name[32];    // Object name
    uint16      count;              // 数量
    ServerDate  lent_date;          // 借阅日期
    uint32      days_to_return;     // 归还天数
    uint8       renew_count;        // 续借次数
    uint8       is_valid;           // 数据是否有效  0-无效 1-有效
} UserLentObject;

typedef enum _UserType{
    USER_TYPE_STUDENT = 0,     // 学生
    USER_TYPE_TEACHER,         // 教师
    USER_TYPE_ADMINISTRATOR,   // 管理员
} UserType;

typedef struct _User {
    UserType                type;                   // 用户类型
    UserPermissions         permission;             // Permissions
    uint32                  id;                     // User ID
    wchar_t                 name[16];               // User name
    wchar_t                 password[16];           // User password
    uint16                  lent_object_count;      // 用户借阅的图书数量
    UserLentObject          lent_objects[BOOK_MANAGE_CONFIG_MAX_BORROW_BOOKS_CONFIG]; // 用户借阅的图书信息
} User;

// 用户信息结构体链表存储
typedef struct _UserNode {
    User user;
    struct _UserNode *next;             // 指向下一个用户信息节点
    struct _UserNode *prev;             // 指向上一个用户信息节点
} UserNode;

typedef struct _UserList {
    UserNode *  first_node;                    // 链表头指针
    UserNode *  last_node;                     // 链表尾指针
    uint32      count;                         // 用户数量
} UserList;

// 用户信息结构体指针链表存储
typedef struct _UserPtrNode {
    User * user;                              // 指向用户信息的指针
    struct _UserPtrNode *next;                // 指向下一个用户信息节点
    struct _UserPtrNode *prev;                // 指向上一个用户信息节点
} UserPtrNode;

typedef struct _UserPtrList {
    UserPtrNode * first_node;                 // 链表头指针
    UserPtrNode * last_node;                  // 链表尾指针
    uint32        count;                      // 用户数量
} UserPtrList;

typedef enum _UserFunctionReturn {
    // 续借结果
    RENEW_BOOK_SUCCESS, // 续借成功
    RENEW_BOOK_NOT_BORROWED, // 未找到借阅记录
    RENEW_BOOK_LIMIT_EXCEEDED, // 续借次数超过限制

    // 登录结果
    LOGIN_SUCCESS = 0, // 登录成功
    LOGIN_USER_NOT_FOUND, // 用户未找到
    LOGIN_PASSWORD_ERROR, // 密码错误

    USER_UNKNOWN_ERROR, // 未知错误
} UserFunctionReturn;

extern uint8        server_user_list_load_flag; // 用户信息列表加载成功标志

extern UserList server_user_list;  // 用户信息链表

UserNode    *  server_find_user_by_id(uint32 id);
UserPtrList *  server_find_user_by_name(wchar_t * name, StringIsSensitive is_sensitive);

uint8       server_add_user(User * user);

uint8       server_delete_user(UserNode * user_node);
uint8       server_delete_user_by_id(uint32 id);

uint8       server_modify_user(UserNode * user_node, User * new_user);

UserFunctionReturn  server_user_login(uint32 user_id, wchar_t * password, User * user_p);

uint8       server_load_user_list(void);
uint8       server_save_user_list(void);

#endif
